From f8412eca34be6e2e655ad3e09bd97fa2bdcbdae0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 16 Aug 2013 22:45:13 -0400 Subject: [PATCH] Revert "Deprecate and ignore the cursor blink settings" This reverts commit b2e666bf8f297eb998331fa8ce0062ce7a5198fa. We need to keep cursor blinking configurable for accessibility reasons. https://bugzilla.gnome.org/show_bug.cgi?id=704134 Conflicts: gdk/win32/gdkproperty-win32.c gdk/x11/gdksettings.c gtk/gtksettings.c gtk/gtktextview.c --- gdk/wayland/gdkscreen-wayland.c | 3 ++ gdk/win32/gdkproperty-win32.c | 3 ++ gdk/x11/gdksettings.c | 3 ++ gtk/gtkentry.c | 51 +++++++++++++++++++++++++------- gtk/gtksettings.c | 13 ++------- gtk/gtktextview.c | 52 ++++++++++++++++++++++++++------- 6 files changed, 93 insertions(+), 32 deletions(-) diff --git a/gdk/wayland/gdkscreen-wayland.c b/gdk/wayland/gdkscreen-wayland.c index 8144383518..d25a954f68 100644 --- a/gdk/wayland/gdkscreen-wayland.c +++ b/gdk/wayland/gdkscreen-wayland.c @@ -497,6 +497,9 @@ static TranslationEntry translations[] = { { "org.gnome.desktop.interface", "cursor-theme", "gtk-cursor-theme-name", G_TYPE_STRING, { .s = "Adwaita" } }, { "org.gnome.desktop.interface", "cursor-size", "gtk-cursor-theme-size", G_TYPE_INT, { .i = 32 } }, { "org.gnome.desktop.interface", "font-name", "gtk-font-name", G_TYPE_STRING, { .s = "Cantarell 11" } }, + { "org.gnome.desktop.interface", "cursor-blink", "gtk-cursor-blink", G_TYPE_BOOLEAN, { .b = TRUE } }, + { "org.gnome.desktop.interface", "cursor-blink-time", "gtk-cursor-blink-time", G_TYPE_INT, { .i = 1200 } }, + { "org.gnome.desktop.interface", "cursor-blink-timeout", "gtk-cursor-blink-timeout", G_TYPE_INT, { .i = 3600 } }, { "org.gnome.desktop.interface", "gtk-im-module", "gtk-im-module", G_TYPE_STRING, { .s = "simple" } }, { "org.gnome.desktop.interface", "enable-animations", "gtk-enable-animations", G_TYPE_BOOLEAN, { .b = TRUE } }, { "org.gnome.settings-daemon.peripherals.mouse", "double-click", "gtk-double-click-time", G_TYPE_INT, { .i = 250 } }, diff --git a/gdk/win32/gdkproperty-win32.c b/gdk/win32/gdkproperty-win32.c index 59ab2c8b0c..72e7512c64 100644 --- a/gdk/win32/gdkproperty-win32.c +++ b/gdk/win32/gdkproperty-win32.c @@ -303,12 +303,15 @@ _gdk_win32_window_delete_property (GdkWindow *window, "Net/DoubleClickTime\0" "gtk-double-click-time\0" "Net/DoubleClickDistance\0" "gtk-double-click-distance\0" "Net/DndDragThreshold\0" "gtk-dnd-drag-threshold\0" + "Net/CursorBlink\0" "gtk-cursor-blink\0" + "Net/CursorBlinkTime\0" "gtk-cursor-blink-time\0" "Net/ThemeName\0" "gtk-theme-name\0" "Net/IconThemeName\0" "gtk-icon-theme-name\0" "Gtk/ColorPalette\0" "gtk-color-palette\0" "Gtk/FontName\0" "gtk-font-name\0" "Gtk/KeyThemeName\0" "gtk-key-theme-name\0" "Gtk/Modules\0" "gtk-modules\0" + "Gtk/CursorBlinkTimeout\0" "gtk-cursor-blink-timeout\0" "Gtk/CursorThemeName\0" "gtk-cursor-theme-name\0" "Gtk/CursorThemeSize\0" "gtk-cursor-theme-size\0" "Gtk/ColorScheme\0" "gtk-color-scheme\0" diff --git a/gdk/x11/gdksettings.c b/gdk/x11/gdksettings.c index b9e653228c..fd7aacd676 100644 --- a/gdk/x11/gdksettings.c +++ b/gdk/x11/gdksettings.c @@ -28,6 +28,8 @@ static const struct { {"Net/DoubleClickTime", "gtk-double-click-time"}, {"Net/DoubleClickDistance", "gtk-double-click-distance"}, {"Net/DndDragThreshold", "gtk-dnd-drag-threshold"}, + {"Net/CursorBlink", "gtk-cursor-blink"}, + {"Net/CursorBlinkTime", "gtk-cursor-blink-time"}, {"Net/ThemeName", "gtk-theme-name"}, {"Net/IconThemeName", "gtk-icon-theme-name"}, {"Gtk/ColorPalette", "gtk-color-palette"}, @@ -50,6 +52,7 @@ static const struct { {"Net/SoundThemeName", "gtk-sound-theme-name"}, {"Net/EnableInputFeedbackSounds", "gtk-enable-input-feedback-sounds"}, {"Net/EnableEventSounds", "gtk-enable-event-sounds"}, + {"Gtk/CursorBlinkTimeout", "gtk-cursor-blink-timeout"}, {"Gtk/ShellShowsAppMenu", "gtk-shell-shows-app-menu"}, {"Gtk/ShellShowsMenubar", "gtk-shell-shows-menubar"}, {"Gtk/EnablePrimaryPaste", "gtk-enable-primary-paste"}, diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 9283d8b875..7df6538976 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -121,9 +121,6 @@ #define MAX_ICONS 2 -#define CURSOR_BLINK_TIME 1200 -#define CURSOR_BLINK_TIMEOUT_SEC 10 - #define IS_VALID_ICON_POSITION(pos) \ ((pos) == GTK_ENTRY_ICON_PRIMARY || \ (pos) == GTK_ENTRY_ICON_SECONDARY) @@ -9760,7 +9757,15 @@ cursor_blinks (GtkEntry *entry) if (gtk_widget_has_focus (GTK_WIDGET (entry)) && priv->editable && priv->selection_bound == priv->current_pos) - return TRUE; + { + GtkSettings *settings; + gboolean blink; + + settings = gtk_widget_get_settings (GTK_WIDGET (entry)); + g_object_get (settings, "gtk-cursor-blink", &blink, NULL); + + return blink; + } else return FALSE; } @@ -9777,6 +9782,28 @@ get_middle_click_paste (GtkEntry *entry) return paste; } +static gint +get_cursor_time (GtkEntry *entry) +{ + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (entry)); + gint time; + + g_object_get (settings, "gtk-cursor-blink-time", &time, NULL); + + return time; +} + +static gint +get_cursor_blink_timeout (GtkEntry *entry) +{ + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (entry)); + gint timeout; + + g_object_get (settings, "gtk-cursor-blink-timeout", &timeout, NULL); + + return timeout; +} + static void show_cursor (GtkEntry *entry) { @@ -9817,6 +9844,7 @@ blink_cb (gpointer data) { GtkEntry *entry; GtkEntryPrivate *priv; + gint blink_timeout; entry = GTK_ENTRY (data); priv = entry->priv; @@ -9834,8 +9862,9 @@ blink_cb (gpointer data) g_assert (priv->selection_bound == priv->current_pos); - if (priv->blink_time > 1000 * CURSOR_BLINK_TIMEOUT_SEC && - CURSOR_BLINK_TIMEOUT_SEC < G_MAXINT/1000) + blink_timeout = get_cursor_blink_timeout (entry); + if (priv->blink_time > 1000 * blink_timeout && + blink_timeout < G_MAXINT/1000) { /* we've blinked enough without the user doing anything, stop blinking */ show_cursor (entry); @@ -9844,15 +9873,15 @@ blink_cb (gpointer data) else if (priv->cursor_visible) { hide_cursor (entry); - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } else { show_cursor (entry); - priv->blink_time += CURSOR_BLINK_TIME; - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_time += get_cursor_time (entry); + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } @@ -9871,7 +9900,7 @@ gtk_entry_check_cursor_blink (GtkEntry *entry) if (!priv->blink_timeout) { show_cursor (entry); - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); } @@ -9898,7 +9927,7 @@ gtk_entry_pend_cursor_blink (GtkEntry *entry) if (priv->blink_timeout != 0) g_source_remove (priv->blink_timeout); - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (entry) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, blink_cb, entry); show_cursor (entry); diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index a32ae772c4..2095bfbb17 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -369,7 +369,8 @@ gtk_settings_class_init (GtkSettingsClass *class) * * Whether the cursor should blink. * - * Deprecated: 3.10: This setting is ignored. + * Also see the #GtkSettings:gtk-cursor-blink-timeout setting, + * which allows more flexible control over cursor blinking. */ result = settings_install_property_parser (class, g_param_spec_boolean ("gtk-cursor-blink", @@ -379,14 +380,6 @@ gtk_settings_class_init (GtkSettingsClass *class) GTK_PARAM_READWRITE | G_PARAM_DEPRECATED), NULL); g_assert (result == PROP_CURSOR_BLINK); - - /** - * GtkSettings:gtk-cursor-blink-time: - * - * Length of the cursor blink cycle, in milliseconds. - * - * Deprecated: 3.10: This setting is ignored. - */ result = settings_install_property_parser (class, g_param_spec_int ("gtk-cursor-blink-time", P_("Cursor Blink Time"), @@ -406,8 +399,6 @@ gtk_settings_class_init (GtkSettingsClass *class) * #GtkSettings:gtk-cursor-blink to %FALSE. * * Since: 2.12 - * - * Deprecated: 3.10: This setting is ignored. */ result = settings_install_property_parser (class, g_param_spec_int ("gtk-cursor-blink-timeout", diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index 3aa1047ac3..999e9daad1 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -118,8 +118,7 @@ #define SPACE_FOR_CURSOR 1 -#define CURSOR_BLINK_TIME 1200 -#define CURSOR_BLINK_TIMEOUT_SEC 10 +#define GTK_TEXT_VIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_TEXT_VIEW, GtkTextViewPrivate)) typedef struct _GtkTextWindow GtkTextWindow; typedef struct _GtkTextPendingScroll GtkTextPendingScroll; @@ -5416,12 +5415,20 @@ gtk_text_view_forall (GtkContainer *container, static gboolean cursor_blinks (GtkTextView *text_view) { + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (text_view)); + gboolean blink; + #ifdef DEBUG_VALIDATION_AND_SCROLLING return FALSE; #endif if (gtk_get_debug_flags () & GTK_DEBUG_UPDATES) return FALSE; + g_object_get (settings, "gtk-cursor-blink", &blink, NULL); + + if (!blink) + return FALSE; + if (text_view->priv->editable) { GtkTextMark *insert; @@ -5431,7 +5438,7 @@ cursor_blinks (GtkTextView *text_view) gtk_text_buffer_get_iter_at_mark (get_buffer (text_view), &iter, insert); if (gtk_text_iter_editable (&iter, text_view->priv->editable)) - return TRUE; + return blink; } return FALSE; @@ -5449,6 +5456,29 @@ get_middle_click_paste (GtkTextView *text_view) return paste; } +static gint +get_cursor_time (GtkTextView *text_view) +{ + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (text_view)); + gint time; + + g_object_get (settings, "gtk-cursor-blink-time", &time, NULL); + + return time; +} + +static gint +get_cursor_blink_timeout (GtkTextView *text_view) +{ + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (text_view)); + gint time; + + g_object_get (settings, "gtk-cursor-blink-timeout", &time, NULL); + + return time; +} + + /* * Blink! */ @@ -5459,6 +5489,7 @@ blink_cb (gpointer data) GtkTextView *text_view; GtkTextViewPrivate *priv; gboolean visible; + gint blink_timeout; text_view = GTK_TEXT_VIEW (data); priv = text_view->priv; @@ -5479,23 +5510,24 @@ blink_cb (gpointer data) visible = gtk_text_layout_get_cursor_visible (priv->layout); - if (priv->blink_time > 1000 * CURSOR_BLINK_TIMEOUT_SEC && - CURSOR_BLINK_TIMEOUT_SEC < G_MAXINT/1000) + blink_timeout = get_cursor_blink_timeout (text_view); + if (priv->blink_time > 1000 * blink_timeout && + blink_timeout < G_MAXINT/1000) { /* we've blinked enough without the user doing anything, stop blinking */ visible = 0; priv->blink_timeout = 0; } else if (visible) - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, blink_cb, text_view); else { - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (text_view) * CURSOR_ON_MULTIPLIER / CURSOR_DIVIDER, blink_cb, text_view); - priv->blink_time += CURSOR_BLINK_TIME; + priv->blink_time += get_cursor_time (text_view); } /* Block changed_handler while changing the layout's cursor visibility @@ -5542,7 +5574,7 @@ gtk_text_view_check_cursor_blink (GtkTextView *text_view) { gtk_text_layout_set_cursor_visible (priv->layout, TRUE); - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (text_view) * CURSOR_OFF_MULTIPLIER / CURSOR_DIVIDER, blink_cb, text_view); } @@ -5573,7 +5605,7 @@ gtk_text_view_pend_cursor_blink (GtkTextView *text_view) gtk_text_view_stop_cursor_blink (text_view); gtk_text_layout_set_cursor_visible (priv->layout, TRUE); - priv->blink_timeout = gdk_threads_add_timeout (CURSOR_BLINK_TIME * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, + priv->blink_timeout = gdk_threads_add_timeout (get_cursor_time (text_view) * CURSOR_PEND_MULTIPLIER / CURSOR_DIVIDER, blink_cb, text_view); } -- 2.30.2